package com.hongxin.nw.netty.down;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hongxin.nw.netty.model.Transfer;
import com.hongxin.nw.netty.model.packing.ASDUcsdna1;
import com.hongxin.nw.netty.model.packing.info.Csdna1_6;
import com.hongxin.nw.netty.utils.FieldPack;
import com.hongxin.nw.netty.utils.pools.AsduStartPools;
import com.hongxin.nw.netty.values.StaticValue;
import com.hongxin.nw.netty.values.TypeIdentif;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @remark 下发计费模型下行数据(正常计费模型下发,应用于正常下发计费,,批量下发计费,,设备连接下发)
 * @author: GuoXiaolin
 * @date 2019/6/25 15:35
 * @Version 1.0
 * @Descibe
 */
@Slf4j
public class BillingReq implements IChannelRequest {
    @Override
    public String doPacking(Transfer transfer) throws Exception {

        String string = String.valueOf(transfer.getObj());
        String code = transfer.getCode();
        JSONObject json = JSONObject.parseObject(string);
        JSONArray ja = json.getJSONArray("timeInfos");
        List<Map<String, String>> list = new ArrayList<>();
        for (int i =0 ; i < ja.size(); i++){
            JSONObject jo = ja.getJSONObject(i);
            Map<String, String> map = new HashMap<>();
            map.put("startTime",jo.getString("startTime")); //    第N个时段起始时间点	BIN码	2Byte	高字节：小时（0-24）  低字节：分钟（0-60）
            map.put("identify",jo.getString("type")); //    第N个时段标志	BIN码	1Byte	1：尖时段；2：峰时段 3：平时段，4：谷时段
            map.put("jEPrice",jo.getString("electricFee")); //9N+2	第N个时段尖电价	BIN码	4Byte	精确到小数点后五位
            map.put("fEPrice",jo.getString("electricFee")); //9N+3	第N个时段峰电价	BIN码	4Byte	精确到小数点后五位
            map.put("pEPrice",jo.getString("electricFee")); //9N+4	第N个时段平电价	BIN码	4Byte	精确到小数点后五位
            map.put("gEPrice",jo.getString("electricFee")); //9N+5	第N个时段谷电价	BIN码	4Byte	精确到小数点后五位
            map.put("serverPrice",jo.getString("serviceFee")); //9N+6	第N个服务费单价	BIN码	4Byte	精确到小数点后五位
            map.put("occupancyPrice",jo.getString("parkingFee")); //9N+7	第N个占位费单价	BIN码	4Byte	精确到小数点后五位
            map.put("subscriptionPrice",jo.getString("subscriptionPrice")); //9N+8	第N个预约费单价	BIN码	4Byte	精确到小数点后五位
            list.add(map);
        }
        Csdna1_6 csdna1_6 = new Csdna1_6()
                .setCo(code)//设备编号
                .setChargeIdentify(json.getString("bj"))//枪口号
                .setBillingModel(json.getString("bid"))//计费id, 随意赋值测试
                .setAotTime(json.getString("aottime"))//生效时间
                .setSotTime(json.getString("sottime"))//失效时间
                .setExecuteStatus(json.getString("excuStatus"))//6	执行状态	压缩BCD码 	2Byte	0001-有效 0002-无效
                .setMeterType(json.getString("MeterType"))//计量类型	压缩BCD码	  2Byte	0001-充电量
                .setTimeNumb(json.getString("timeNumb")) //时段数N	BIN码	1Byte	取值范围：0—12
                .setTimeInfos(list);

        //TYPE = 133 , COT = 6
        ASDUcsdna1 mm = new ASDUcsdna1();
        mm.setLogType(String.valueOf(TypeIdentif.RECORD_CHARGING_MODEL.getInt()));
        mm.setSendData(csdna1_6.packing());
//        as.setType(TypeIdentif.IDENTIFY_C_SD_NA_1.getInt());
//        as.setCot(TypeIdentif.COT_UNKNOWN_COT.getInt());
//        as.setStaadr(AsduStartPools.getAsduStart(code).getStatAddress());
//        as.setInfoadr(Integer.valueOf(json.getString("bj")));
//        as.setVsq(0, StaticValue.SQ0);

        String as = FieldPack.packASDU(TypeIdentif.IDENTIFY_C_SD_NA_1.getInt(),
                TypeIdentif.COT_UNKNOWN_COT.getInt(),
                AsduStartPools.getAsduStart(code).getStatAddress(),Integer.valueOf(json.getString("bj")),
                StaticValue.DEFAULT_VSQ, StaticValue.SQ0);

        String data = as + mm.getHexData();

//        APCI ac = new APCI();
//        ac.setIdentifyStart(TypeIdentif.IDENTIFY_START.getInt());
//        ac.setApduLength(as.getHexData().length()/2);
//        ac.setContarea(TypeIdentif.FORMAT_I.getStr(), StaticValue.U_TEST_V);
//        return ac.getHexData() + as.getHexData();

        String ac = FieldPack.packAPCI(data.length(), TypeIdentif.FORMAT_I.getStr(), StaticValue.U_TEST_V);
        return ac + data;
    }
}
